home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-10-23 | 5.0 KB | 224 lines | [TEXT/Pyth] |
- #
- # binhextree - Recursively descend a directory and
- # pack all resource files.
- #
- # Jack Jansen, CWI, August 1995.
- #
-
- import os
- import binhex
- import sys
- import macostools
- import macfs
-
- import aetools
- from Metrowerks_Shell_Suite import Metrowerks_Shell_Suite
- from Required_Suite import Required_Suite
-
- class MwShell(aetools.TalkTo, Metrowerks_Shell_Suite, Required_Suite):
- pass
-
- # Top-level directory
- TOP=''
-
- # Where to put CW projects, relative to TOP
- CWDIR=':Mac:mwerks:projects'
- # From which folders to put projects there
- CWDIRDIRS=['build.macppc.stand', 'build.macppc.shared', 'build.mac68k.stand', 'build.mac68k.shared', 'PlugIns']
-
- # Helper routines
- def binhexit(path, name):
- dstfile = path + '.hqx'
- if os.path.exists(dstfile):
- print 'Compare', path,'...',
- if binhexcompare(path, dstfile):
- print 'Identical, skipped.'
- return
- else:
- print 'Not up-to-date.'
- print 'Binhexing', path
- binhex.binhex(path, dstfile)
-
- def binhexcompare(source, hqxfile):
- """(source, hqxfile) - Check whether the two files match (forks only)"""
- ifp = binhex.HexBin(hqxfile)
-
- sfp = open(source, 'rb')
- while 1:
- d = ifp.read(128000)
- d2 = sfp.read(128000)
- if d <> d2:
- return 0
- if not d: break
- sfp.close()
- ifp.close_data()
-
- d = ifp.read_rsrc(128000)
- if d:
- sfp = binhex.openrsrc(source, 'rb')
- d2 = sfp.read(128000)
- if d <> d2:
- return 0
- while 1:
- d = ifp.read_rsrc(128000)
- d2 = sfp.read(128000)
- if d <> d2:
- return 0
- if not d: break
- return 1
-
- # Project files to handle
- project_files = {}
-
- def hexbincwprojects(creator):
- """Compact and hexbin all files remembered with a given creator"""
- try:
- mgr = MwShell(creator, start=1)
- except 'foo':
- print 'Not handled:', creator
- return
- for fss in project_files[creator]:
- srcfile = fss.as_pathname()
-
- if srcfile[-1] == 'µ':
- dstfile = srcfile[:-1]+'mu.hqx'
- elif srcfile[-3] == '.mu':
- dstfile = srcfile + '.hqx'
- elif ord(srcfile[-1]) >= 128:
- dstfile = srcfile[:-1]+`ord(srcfile[-1])`+'.hqx'
- else:
- dstfile = srcfile + '.hqx'
-
- if os.path.exists(dstfile) and \
- os.stat(dstfile)[8] >= os.stat(srcfile)[8]:
- print 'Skip', dstfile,'- Up-to-date'
- continue
- print 'Compacting', dstfile
- mgr.open(fss)
- mgr.Reset_File_Paths()
- mgr.Remove_Binaries()
- mgr.Close_Project()
-
- print 'Binhexing', dstfile
- binhex.binhex(srcfile, dstfile)
- mgr.quit()
-
- def copycwproject(path, name):
- """Copy CW project (if needed) and remember for hexbinning"""
- global project_files
-
- dstdir = os.path.join(TOP, CWDIR)
- if path[:len(dstdir)] == dstdir:
- return
- srcdir = os.path.split(path)[0]
- srcdir = os.path.split(srcdir)[1]
- if srcdir in CWDIRDIRS:
- if not os.path.exists(dstdir):
- print dstdir
- print 'No CW-project dir, skip', name
- return
- dstfile = os.path.join(dstdir, name)
- else:
- if path[-2:] != '.µ':
- return
- dstfile = path[:-2]+ '.mu'
-
- # If the destination doesn't exists or is older that the source
- # we copy and remember it
-
- if os.path.exists(dstfile) and \
- os.stat(dstfile)[8] >= os.stat(path)[8]:
- print 'Not copying', path,'- Up-to-date'
- else:
- print 'Copy', path
- macostools.copy(path, dstfile)
-
- fss = macfs.FSSpec(dstfile)
- creator = fss.GetCreatorType()[0]
-
- if project_files.has_key(creator):
- project_files[creator].append(fss)
- else:
- project_files[creator] = [fss]
-
- def copycwexpfile(path, name):
- """Copy CW export file"""
- global project_files
-
- dstdir = os.path.join(TOP, CWDIR)
- if path[:len(dstdir)] == dstdir:
- return
- srcdir = os.path.split(path)[0]
- srcdir = os.path.split(srcdir)[1]
- if srcdir in CWDIRDIRS:
- if not os.path.exists(dstdir):
- print dstdir
- print 'No CW-project dir, skip', name
- return
- dstfile = os.path.join(dstdir, name)
- else:
- if path[-6:] != '.µ.exp':
- return
- dstfile = path[:-6] + '.mu.exp'
- if dstfile[-6:] == '.µ.exp':
- dstfile = dstfile[:-6]+'.mu.exp'
-
- # If the destination doesn't exists or is older that the source
- # we copy and remember it
-
- if os.path.exists(dstfile) and \
- os.stat(dstfile)[8] >= os.stat(path)[8]:
- print 'Not copying', path,'- Up-to-date'
- else:
- print 'Copy', path
- macostools.copy(path, dstfile)
-
- extensions = [
- ('.rsrc', binhexit),
- ('.gif', binhexit),
- ('.µ', copycwproject),
- ('.µ.exp', copycwexpfile)
- ]
-
- def walker(arg, top, names):
- lnames = names[:]
- for n in lnames:
- if n[0] == '(' and n[-1] == ')':
- names.remove(n)
- continue
- for ext, handler in extensions:
- if n[-len(ext):] == ext:
- name = os.path.join(top, n)
- handler(name, n)
-
- def dodir(name):
- global TOP, project_files
- TOP = name
- os.path.walk(name, walker, None)
-
- for creator in project_files.keys():
- hexbincwprojects(creator)
- project_files = {}
-
- def main():
- if len(sys.argv) > 1:
- for dir in sys.argv[1:]:
- dodir(dir)
- elif os.name == 'mac':
- import macfs
- dir, ok = macfs.GetDirectory('Folder to search:')
- if not ok:
- sys.exit(0)
- dodir(dir.as_pathname())
- else:
- print 'Usage: hexbintree dir ...'
- sys.exit(1)
- if os.name == 'mac':
- sys.exit(1) # Keep window
- else:
- sys.exit(0)
-
- if __name__ == '__main__':
- main()
-
-